package com.superquan.selfstudybootmybatis.utils.proxy.dynamic_proxy_cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @program: self-study-bootmybatis
 * @ClassName CglibProxy
 * @description: cglib动态代理主要类
 * @author: zwq
 * CGLIB动态代理和jdk代理一样，使用反射完成代理，不同的是他可以直接代理类（jdk动态代理不行，他必须目标业务类必须实现接口）
 * CGLIB动态代理底层使用字节码技术，CGLIB动态代理不能对 final类进行继承。（CGLIB动态代理需要导入jar包）
 *
 **/
public class CglibProxy implements MethodInterceptor {

    private Object targetObject;

    //这里的目标类型为Object，则可以接受任意一种参数作为被代理类，实现了动态代理
    public Object getInstance(Object target){
        this.targetObject=target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    //代理实际方法
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("开始事务-cglib");
        Object result = proxy.invoke(targetObject, args);
        System.out.println("关闭事务-cglib");
        //返回代理对象
        return result;
    }
}
